From 7c83ee123456db10a3da1516b8987ac6bf15d129 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=98yvind=20Kol=C3=A5s?= Date: Tue, 30 Jan 2018 16:35:28 +0100 Subject: [PATCH] babl: fix icc matrix profile fast paths For core members, babl relies on shared data layout between fish and conversion to be able to do dispatch, and have source/target match - though only for simple fishes. The ICC fast path conversions also used the user data - but directly instead of throug the argument, changing this makes the matrix and luts work again - and let the conversions be used. --- babl/babl-fish-path.c | 2 +- babl/babl-fish.h | 4 ++++ babl/babl-space.c | 44 +++++++++++++++++++++---------------------- 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/babl/babl-fish-path.c b/babl/babl-fish-path.c index 54e9ee4..c5aca9b 100644 --- a/babl/babl-fish-path.c +++ b/babl/babl-fish-path.c @@ -697,7 +697,7 @@ _babl_fish_rig_dispatch (Babl *babl) /* lift out conversion from single step conversion and make it be the dispatch function * itself */ - babl->fish.data = &babl->fish_simple.conversion->data; + babl->fish.data = &(babl->fish_simple.conversion->data); babl->fish.dispatch = babl->fish_simple.conversion->dispatch; } else diff --git a/babl/babl-fish.h b/babl/babl-fish.h index a26a032..db4e06f 100644 --- a/babl/babl-fish.h +++ b/babl/babl-fish.h @@ -47,6 +47,10 @@ typedef struct { BablFish fish; BablConversion *conversion; + double cost; /* number of ticks *10 + chain_length */ + int source_bpp; + int dest_bpp; + void *foo; } BablFishSimple; diff --git a/babl/babl-space.c b/babl/babl-space.c index 6794c2c..b5557fb 100644 --- a/babl/babl-space.c +++ b/babl/babl-space.c @@ -575,12 +575,12 @@ static void prep_conversion (const Babl *babl) static inline void -universal_nonlinear_rgba_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +universal_nonlinear_rgba_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data) { const Babl *source_space = babl_conversion_get_source_space (conversion); const Babl *destination_space = babl_conversion_get_destination_space (conversion); - float * matrixf = conversion->conversion.data; + float * matrixf = data; float *rgba_in = (void*)src_char; float *rgba_out = (void*)dst_char; @@ -592,10 +592,10 @@ universal_nonlinear_rgba_converter (const Babl *conversion,unsigned char *src_ch } static inline void -universal_nonlinear_rgb_linear_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +universal_nonlinear_rgb_linear_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data) { const Babl *source_space = babl_conversion_get_source_space (conversion); - float * matrixf = conversion->conversion.data; + float * matrixf = data; float *rgba_in = (void*)src_char; float *rgba_out = (void*)dst_char; @@ -605,11 +605,11 @@ universal_nonlinear_rgb_linear_converter (const Babl *conversion,unsigned char * } static inline void -universal_nonlinear_rgba_u8_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +universal_nonlinear_rgba_u8_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data) { const Babl *destination_space = conversion->conversion.destination->format.space; - float * matrixf = conversion->conversion.data; + float * matrixf = data; float * in_trc_lut = matrixf + 9; int i; uint8_t *rgba_in_u8 = (void*)src_char; @@ -643,9 +643,9 @@ universal_nonlinear_rgba_u8_converter (const Babl *conversion,unsigned char *src static inline void -universal_rgba_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +universal_rgba_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data) { - float *matrixf = conversion->conversion.data; + float *matrixf = data; float *rgba_in = (void*)src_char; float *rgba_out = (void*)dst_char; @@ -653,9 +653,9 @@ universal_rgba_converter (const Babl *conversion,unsigned char *src_char, unsign } static inline void -universal_rgb_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +universal_rgb_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data) { - float *matrixf = conversion->conversion.data; + float *matrixf = data; float *rgb_in = (void*)src_char; float *rgb_out = (void*)dst_char; @@ -664,11 +664,11 @@ universal_rgb_converter (const Babl *conversion,unsigned char *src_char, unsigne static inline void -universal_nonlinear_rgb_u8_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +universal_nonlinear_rgb_u8_converter (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data) { const Babl *destination_space = conversion->conversion.destination->format.space; - float * matrixf = conversion->conversion.data; + float * matrixf = data; float * in_trc_lut = matrixf + 9; int i; uint8_t *rgb_in_u8 = (void*)src_char; @@ -731,11 +731,11 @@ static inline void babl_matrix_mul_vectorff_buf4_sse2 (const float *mat, static inline void -universal_nonlinear_rgba_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +universal_nonlinear_rgba_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data) { const Babl *source_space = babl_conversion_get_source_space (conversion); const Babl *destination_space = babl_conversion_get_destination_space (conversion); - float * matrixf = conversion->conversion.data; + float * matrixf = data; float *rgba_in = (void*)src_char; float *rgba_out = (void*)dst_char; @@ -748,9 +748,9 @@ universal_nonlinear_rgba_converter_sse2 (const Babl *conversion,unsigned char *s static inline void -universal_rgba_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +universal_rgba_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data) { - float *matrixf = conversion->conversion.data; + float *matrixf = data; float *rgba_in = (void*)src_char; float *rgba_out = (void*)dst_char; @@ -758,11 +758,11 @@ universal_rgba_converter_sse2 (const Babl *conversion,unsigned char *src_char, u } static inline void -universal_nonlinear_rgba_u8_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +universal_nonlinear_rgba_u8_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data) { const Babl *destination_space = conversion->conversion.destination->format.space; - float * matrixf = conversion->conversion.data; + float * matrixf = data; float * in_trc_lut = matrixf + 9; int i; uint8_t *rgba_in_u8 = (void*)src_char; @@ -793,11 +793,11 @@ universal_nonlinear_rgba_u8_converter_sse2 (const Babl *conversion,unsigned char } static inline void -universal_nonlinear_rgb_u8_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +universal_nonlinear_rgb_u8_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data) { const Babl *destination_space = conversion->conversion.destination->format.space; - float * matrixf = conversion->conversion.data; + float * matrixf = data; float * in_trc_lut = matrixf + 9; int i; uint8_t *rgb_in_u8 = (void*)src_char; @@ -828,10 +828,10 @@ universal_nonlinear_rgb_u8_converter_sse2 (const Babl *conversion,unsigned char static inline void -universal_nonlinear_rgb_linear_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples) +universal_nonlinear_rgb_linear_converter_sse2 (const Babl *conversion,unsigned char *src_char, unsigned char *dst_char, long samples, void *data) { const Babl *source_space = babl_conversion_get_source_space (conversion); - float * matrixf = conversion->conversion.data; + float * matrixf = data; float *rgba_in = (void*)src_char; float *rgba_out = (void*)dst_char; -- 2.30.2